package at.horario.model;

import static javax.persistence.CascadeType.ALL;
import javax.persistence.*;
import static javax.persistence.FetchType.EAGER;
import static javax.persistence.FetchType.LAZY;
import static javax.persistence.GenerationType.AUTO;
import java.io.Serializable;
import java.util.Date;
import java.util.Set;

@Entity
public class Horario extends GenericObject<Long> implements Serializable {
    @ManyToOne(fetch = EAGER)
    @JoinColumn(name = "ciclo")
    private Ciclo ciclo;
    @Column(precision = 1, scale = 0)
    private Turno turno;
    @Column(length = 50)
    private String descricao;
    @Column(length = 23)
    private Date dataCriacao;
    @Column(length = 1)
    private Boolean processado;
    @Id
    @GeneratedValue(strategy = AUTO)
    private Long horarioId;
    private User user;

    @OneToMany(fetch = LAZY, mappedBy = "horario", cascade = ALL)
    private Set<HorarioClasseGrupo> horarioClasseGrupos;
    @OneToMany(fetch = LAZY, mappedBy = "horario", cascade = ALL)
    private Set<Turma> turmas;
    @OneToMany(fetch = LAZY, mappedBy = "horario", cascade = ALL)
    private Set<Professor> professores;
    @OneToMany(fetch = LAZY, mappedBy = "horario", cascade = ALL)
    private Set<Celula> celulas;
    @OneToMany(fetch = LAZY, mappedBy = "horario", cascade = ALL)
    private Set<HorarioSchedule> horarioSchedules;

    public Set<HorarioSchedule> getHorarioSchedules() {
        return horarioSchedules;
    }

    public void setHorarioSchedules(Set<HorarioSchedule> horarioSchedules) {
        this.horarioSchedules = horarioSchedules;
    }

    public Set<Celula> getCelulas() {
        return celulas;
    }

    public void setCelulas(Set<Celula> celulas) {
        this.celulas = celulas;
    }

    public Set<Professor> getProfessores() {
        return professores;
    }

    public void setProfessores(Set<Professor> professores) {
        this.professores = professores;
    }

    public Set<Turma> getTurmas() {
        return turmas;
    }

    public void setTurmas(Set<Turma> turmas) {
        this.turmas = turmas;
    }


    public Ciclo getCiclo() {
        return ciclo;
    }

    public void setCiclo(Ciclo ciclo) {
        this.ciclo = ciclo;
    }

    public Turno getTurno() {
        return turno;
    }

    public void setTurno(Turno turno) {
        this.turno = turno;
    }

    public String getDescricao() {
        return descricao;
    }

    public void setDescricao(String descricao) {
        this.descricao = descricao;
    }

    public Date getDataCriacao() {
        return dataCriacao;
    }

    public void setDataCriacao(Date dataCriacao) {
        this.dataCriacao = dataCriacao;
    }

    public Boolean getProcessado() {
        return processado;
    }

    public void setProcessado(Boolean processado) {
        this.processado = processado;
    }

    public Long getHorarioId() {
        return horarioId;
    }

    public void setHorarioId(Long horarioId) {
        this.horarioId = horarioId;
    }


    public String toString() {
        return "Horario{" +
                "ciclo=" + ciclo +
                ", turno=" + turno +
                ", descricao='" + descricao + '\'' +
                ", dataCriacao=" + dataCriacao +
                ", processado=" + processado +
                ", horarioId=" + horarioId +
                ", user=" + user +
                '}';
    }

    public boolean equals(Object o) {
        if (this == o) return true;
        if (!(o instanceof Horario)) return false;

        Horario horario = (Horario) o;

        return !(horarioId != null ? !horarioId.equals(horario.horarioId) : horario.horarioId != null);

    }

    public int hashCode() {
        int result;
        result = (ciclo != null ? ciclo.hashCode() : 0);
        result = 31 * result + (turno != null ? turno.hashCode() : 0);
        result = 31 * result + (descricao != null ? descricao.hashCode() : 0);
        result = 31 * result + (dataCriacao != null ? dataCriacao.hashCode() : 0);
        result = 31 * result + (processado != null ? processado.hashCode() : 0);
        result = 31 * result + (horarioId != null ? horarioId.hashCode() : 0);
        return result;
    }

    public Long getId() {
        return horarioId;
    }


    public Set<HorarioClasseGrupo> getHorarioClasseGrupos() {
        return horarioClasseGrupos;
    }

    public void setHorarioClasseGrupos(Set<HorarioClasseGrupo> horarioClasseGrupos) {
        this.horarioClasseGrupos = horarioClasseGrupos;
    }
}
